#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<algorithm>
#include<functional>
using namespace std;

const int maxn = 510;
vector<int> G[maxn];
int inDegree[maxn];
int visited[maxn];
int N, M;
vector<int> ans;

void init(){
	for(int i = 1; i <= N; i ++){
		G[i].clear();
	}
	memset(inDegree, 0, maxn * sizeof(char));
	memset(visited, 0, maxn * sizeof(char));
	ans.clear();
}

void dsf(int node){
	visited[node] = 1;
	for(int edgeIdx = 0; edgeIdx < G[node].size(); edgeIdx ++){
		int nextNode = G[node][edgeIdx];
		if(visited[nextNode] == 0){
			dsf(nextNode);
		}
	}
	ans.push_back(node);
}

void solve(){
	for(int i = N; i >= 1; i --){
		sort(G[i].begin(), G[i].end(), greater<int>());
		if(visited[i] == 0 && inDegree[i] == 0){
			dsf(i);
		}
	}
}


void printAns(){
	vector<int>::reverse_iterator rit = ans.rbegin();
	while(rit != ans.rend()){
		if(rit == ans.rbegin()){
			printf("%d", *rit);
		}else{
			printf(" %d", *rit);
		}
		rit ++;
	}
	printf("\n");
}

int main(void){
	while(scanf("%d %d", &N, &M) == 2){
		init();

		for(int i = 0; i < M; i ++){
			int a, b;
			scanf("%d %d", &a, &b);
			G[a].push_back(b);
			inDegree[b] ++;
		}
		
		solve();

		printAns();
	}
	return 0;
}
